##
##    This file is part of Metrix.
##
##    Metrix is free software: you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation, either version 3 of the License, or
##    (at your option) any later version.
##
##    Metrix is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with Metrix.  If not, see <http://www.gnu.org/licenses/>.
##

class Incidente < ActiveRecord::Base
	belongs_to :version, :dependent => true

	belongs_to :creador, :foreign_key => "creador_id", :class_name => "Recurso", :dependent => true
	belongs_to :asignado, :foreign_key => "asignado_id", :class_name => "Recurso", :dependent => true

#	has_one :creador_id, :class_name => "Recurso"
#	has_one :asignado_id, :class_name => "Recurso"

	validates_presence_of :version, :descripcion, :fecha_apertura, :creador, :message => "es un campo obligatorio"

	validates_inclusion_of :tipo_incidente, :in => ['Bug', 'Mejora', 'Nueva funcionalidad', 'Tarea']
	validates_inclusion_of :severidad, :in => %w{ Critico Mayor Menor Trivial Opcional }
	validates_inclusion_of :estado, :in => %w{ Abierto Asignado Corregido Cerrado }
	
	validates_numericality_of :costo, :only_integer => true, #:greater_than => 0,
					  :if => :incidenteCerrado?,
						:message => "debe ser un entero positivo si el incidente fue cerrado"
	validates_inclusion_of :costo, :in => 1..2147483647,
					  :if => :incidenteCerrado?,
						:message => "debe ser un entero positivo (de 1 a 2147483647) si el incidente fue cerrado"

#las fechas no pueden ser futuras y deben seguir el orden apertura-asignacion-correccion-cierre
	validates_date :fecha_apertura, :message => "es una fecha invalida", 
					:before => 1.day.from_now.to_date, :before_message => "debe ser anterior a hoy (u hoy)"

	validates_date :fecha_asignacion, :message => "es una fecha invalida", 
					:after => :fecha_apertura, :after_message => "debe ser posterior a la fecha de apertura", 
					:before => 1.day.from_now.to_date, 
						:before_message => "debe ser anterior a hoy (u hoy)", :allow_nil => true

	validates_date :fecha_correccion, :message => "es una fecha invalida", 
					:after => :fecha_asignacion, :after_message => "debe ser posterior a la fecha de asignacion", 
					:before => 1.day.from_now.to_date, 
						:before_message => "debe ser anterior a hoy (u hoy)", :allow_nil => true

	validates_date :fecha_cierre, :message => "es una fecha invalida", 
					:after => :fecha_correccion, :after_message => "debe ser posterior a la fecha de correccion", 
					:before => 1.day.from_now.to_date, 
						:before_message => "debe ser anterior a hoy (u hoy)", :allow_nil => true
#tiene que haber recurso asignado si el estado es asignado, corregido o cerrado
	validates_presence_of :asignado, 
					:if => :incidenteAsignado? , 
					:message => "no puede estar vacio si el Incidente ya fue asignado"

	validates_presence_of :asignado, 
					:if => :incidenteCorregido? , 
					:message => "no puede estar vacio si el Incidente ya fue corregido"

	validates_presence_of :asignado, 
					:if => :incidenteCerrado? , 
					:message => "no puede estar vacio si el Incidente ya fue cerrado"

#fechas que deben tener valor segun el estado
	validates_presence_of :fecha_asignacion, 
					:if => :incidenteAsignado? ,
					:message => "no puede estar vacia si el Incidente ya fue asignado"

	validates_presence_of :fecha_asignacion, 
					:if => :incidenteCorregido? ,
					:message => "no puede estar vacia si el Incidente ya fue corregido"

	validates_presence_of :fecha_correccion, 
					:if => :incidenteCorregido? ,
					:message => "no puede estar vacia si el Incidente ya fue corregido"

	validates_presence_of :fecha_asignacion, 
					:if => :incidenteCerrado? ,
					:message => "no puede estar vacia si el Incidente ya fue cerrado"

	validates_presence_of :fecha_correccion, 
					:if => :incidenteCerrado? ,
					:message => "no puede estar vacia si el Incidente ya fue cerrado"

	validates_presence_of :fecha_cierre, 
					:if => :incidenteCerrado? ,
					:message => "no puede estar vacia si el Incidente ya fue cerrado"

#estados obligatorios segun las fechas que tienen valores validos
	validates_inclusion_of :estado, :in => %w{ Asignado Corregido Cerrado },
		:if => :fechaAsignacionValida?, 
		:message => "no puede ser abierto si existe fecha de asignacion"

	validates_inclusion_of :estado, :in => %w{ Corregido Cerrado },
		:if => :fechaCorreccionValida?, 
		:message => "no puede ser abierto o asignado si existe fecha de correccion"

	validates_inclusion_of :estado, :in => %w{ Cerrado },
		:if => :fechaCierreValida?, 
		:message => "no puede ser abierto, asignado o corregido si existe fecha de cierre"

#cerrado si hay costo
#	validates_inclusion_of :estado, :in => %w{ Cerrado },
#		:if => :costoValido?, 
#		:message => "no puede ser abierto, asignado o corregido si tiene un costo asignado"

#metodos auxiliares
  def incidenteAsignado?
		estado == "Asignado"
  end

  def incidenteCorregido?
		estado == "Corregido"
  end

  def incidenteCerrado?
		estado == "Cerrado"
  end

	def fechaAsignacionValida?
		fecha_asignacion != nil
	end

	def fechaCorreccionValida?
		fecha_correccion != nil
	end

	def fechaCierreValida?
		fecha_cierre != nil
	end

	def costoValido?
		costo != nil
	end

  def to_s
    "Incidente #{id}"
  end

end
